/*******************************************************************************
 * Copyright 2010 Simon Mieth
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package org.kabeja.svg;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.kabeja.svg.generators.SVG3DFaceGenerator;
import org.kabeja.svg.generators.SVG3DSolidGenerator;
import org.kabeja.svg.generators.SVGArcGenerator;
import org.kabeja.svg.generators.SVGAttribDefinitionGenerator;
import org.kabeja.svg.generators.SVGAttribGenerator;
import org.kabeja.svg.generators.SVGCircleGenerator;
import org.kabeja.svg.generators.SVGDimensionGenerator;
import org.kabeja.svg.generators.SVGEllipseGenerator;
import org.kabeja.svg.generators.SVGHatchGenerator;
import org.kabeja.svg.generators.SVGImageGenerator;
import org.kabeja.svg.generators.SVGInsertGenerator;
import org.kabeja.svg.generators.SVGLWPolylineGenerator;
import org.kabeja.svg.generators.SVGLeaderGenerator;
import org.kabeja.svg.generators.SVGLineGenerator;
import org.kabeja.svg.generators.SVGMLineGenerator;
import org.kabeja.svg.generators.SVGMTextGenerator;
import org.kabeja.svg.generators.SVGPointGenerator;
import org.kabeja.svg.generators.SVGPolylineGenerator;
import org.kabeja.svg.generators.SVGRayGenerator;
import org.kabeja.svg.generators.SVGShapeGenerator;
import org.kabeja.svg.generators.SVGSolidGenerator;
import org.kabeja.svg.generators.SVGSplineGenerator;
import org.kabeja.svg.generators.SVGTextGenerator;
import org.kabeja.svg.generators.SVGToleranceGenerator;
import org.kabeja.svg.generators.SVGTraceGenerator;
import org.kabeja.svg.generators.SVGViewportGenerator;
import org.kabeja.svg.generators.SVGXLineGenerator;
import org.kabeja.util.Constants;


public class SVGSAXGeneratorManager {
    protected Map generators = new HashMap();
    protected Map pathBoundaryGenerator = new HashMap();

    public SVGSAXGeneratorManager() {
        this.initialize();
    }

    public SVGSAXGenerator getSVGGenerator(String entityType)
        throws SVGGenerationException {
        SVGSAXGenerator gen = (SVGSAXGenerator) this.generators.get(entityType);


        
        if (gen == null) {
            throw new SVGGenerationException("EntityType:" + entityType +
                " not supported");
        } else {
            return gen;
        }
    }

    public SVGPathBoundaryGenerator getSVGPathBoundaryGenerator(String type) {
        return (SVGPathBoundaryGenerator) this.pathBoundaryGenerator.get(type);
    }

    public void setSVGSAXGenerator(SVGSAXGenerator generator, String entityType) {
        this.generators.put(entityType, generator);
    }

    protected void initialize() {
        // setup all generators here
        this.generators.put(Constants.ENTITY_TYPE_3DFACE,
            new SVG3DFaceGenerator());
        this.generators.put(Constants.ENTITY_TYPE_3DSOLID,
            new SVG3DSolidGenerator());
        this.generators.put(Constants.ENTITY_TYPE_ARC, new SVGArcGenerator());
        this.generators.put(Constants.ENTITY_TYPE_ATTRIB,
            new SVGAttribGenerator());

        this.generators.put(Constants.ENTITY_TYPE_ATTDEF,
                new SVGAttribDefinitionGenerator());
        this.generators.put(Constants.ENTITY_TYPE_CIRCLE,
            new SVGCircleGenerator());
        this.generators.put(Constants.ENTITY_TYPE_DIMENSION,
            new SVGDimensionGenerator());
        this.generators.put(Constants.ENTITY_TYPE_ELLIPSE,
            new SVGEllipseGenerator());
        this.generators.put(Constants.ENTITY_TYPE_HATCH,
            new SVGHatchGenerator());
        this.generators.put(Constants.ENTITY_TYPE_IMAGE,
            new SVGImageGenerator());
        this.generators.put(Constants.ENTITY_TYPE_INSERT,
            new SVGInsertGenerator());
        this.generators.put(Constants.ENTITY_TYPE_LEADER,
            new SVGLeaderGenerator());
        this.generators.put(Constants.ENTITY_TYPE_LINE,
            new SVGLineGenerator());

        this.generators.put(Constants.ENTITY_TYPE_LWPOLYLINE,
            new SVGLWPolylineGenerator());
        this.generators.put(Constants.ENTITY_TYPE_MLINE,
            new SVGMLineGenerator());
        this.generators.put(Constants.ENTITY_TYPE_MTEXT,
            new SVGMTextGenerator());
        this.generators.put(Constants.ENTITY_TYPE_POINT,
            new SVGPointGenerator());
        this.generators.put(Constants.ENTITY_TYPE_POLYLINE,
            new SVGPolylineGenerator());
        this.generators.put(Constants.ENTITY_TYPE_RAY, new SVGRayGenerator());
        this.generators.put(Constants.ENTITY_TYPE_SHAPE,
            new SVGShapeGenerator());
        this.generators.put(Constants.ENTITY_TYPE_SOLID,
            new SVGSolidGenerator());
        this.generators.put(Constants.ENTITY_TYPE_SPLINE,
            new SVGSplineGenerator());
        this.generators.put(Constants.ENTITY_TYPE_TEXT,
            new SVGTextGenerator());
        this.generators.put(Constants.ENTITY_TYPE_TOLERANCE,
            new SVGToleranceGenerator());
        this.generators.put(Constants.ENTITY_TYPE_TRACE,
            new SVGTraceGenerator());

        this.generators.put(Constants.ENTITY_TYPE_VIEWPORT,
            new SVGViewportGenerator());
        this.generators.put(Constants.ENTITY_TYPE_XLINE,
            new SVGXLineGenerator());

        //filter the boundarypathgenerators
        Iterator i = this.generators.keySet().iterator();

        while (i.hasNext()) {
            String type = (String) i.next();
            Object obj = this.generators.get(type);

            if (obj instanceof SVGPathBoundaryGenerator) {
                this.pathBoundaryGenerator.put(type, obj);
            }
        }
    }
}
